package com.offics.frame.domain.repository;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.offics.frame.domain.entity.User;
import java.util.Optional;

/**
 * 用户仓储接口
 */
public interface UserRepository {

    /**
     * 根据ID查询用户
     *
     * @param id 用户ID
     * @return 用户
     */
    Optional<User> findById(Long id);

    /**
     * 根据用户名查询用户
     *
     * @param username 用户名
     * @return 用户
     */
    Optional<User> findByUsername(String username);

    /**
     * 根据手机号查询用户
     *
     * @param phone 手机号
     * @return 用户
     */
    Optional<User> findByPhone(String phone);

    /**
     * 根据邮箱查询用户
     *
     * @param email 邮箱
     * @return 用户
     */
    Optional<User> findByEmail(String email);

    /**
     * 保存用户
     *
     * @param user 用户
     * @return 保存后的用户
     */
    boolean save(User user);

    /**
     * 保存用户并返回保存后的用户
     *
     * @param user 用户
     * @return 保存后的用户
     */
    User saveAndReturn(User user);

    /**
     * 更新用户
     *
     * @param user 用户
     * @return 是否成功
     */
    boolean update(User user);

    /**
     * 删除用户
     *
     * @param id 用户ID
     * @return 是否成功
     */
    boolean deleteById(Long id);

    /**
     * 分页查询用户
     *
     * @param page     分页参数
     * @param username 用户名
     * @param phone    手机号
     * @param status   状态
     * @return 分页结果
     */
    IPage<User> findPage(IPage<User> page, String username, String phone, Integer status);

    /**
     * 检查用户名是否存在
     *
     * @param username 用户名
     * @return 是否存在
     */
    boolean existsByUsername(String username);

    /**
     * 检查手机号是否存在
     *
     * @param phone 手机号
     * @return 是否存在
     */
    boolean existsByPhone(String phone);

    /**
     * 检查邮箱是否存在
     *
     * @param email 邮箱
     * @return 是否存在
     */
    boolean existsByEmail(String email);
}